# coding=utf-8
import json
import sys
import time

import allure
import pytest
from jsonpath import jsonpath
from common.assert_operator import *
from common.db import *
# sys.path.append("..")
from common.read_yaml import *
from common.utils import Utils

string_assert = string_assert() # 字符串校验类
pact = Pact() # 契约校验类
execute_sql = sql() # sql集合
utils = Utils()
data = ReadYaml_By_Root_Dict("case/01_initiate_process_test/01_1_CreateProcess_Confirm.yml").get_yaml_data()  # 读取数据


@allure.feature('发起明确路径场景')  # 测试报告显示测试功能
class Test_01_1_CreateProcess_Confirm():

    # 获取yml文件中[发起明确路径]的数据参数
    initiate_process_params = data['发起明确路径']
    # 获取yml的title，并作为ids的值传给用例，不能直接使用ids_list = initiate_process_params[*][0]，列表取值不支持
    ids_list = jsonpath.jsonpath(initiate_process_params,"$[*][0]")
    @pytest.mark.parametrize("title, param, expect", initiate_process_params,ids=ids_list)
    def test_CreateProcess_Confirm(self, user_login, title, param, expect):
        Logger.info("*************** {}开始执行用例 ***************".format(title))
        allure.dynamic.description(f"{param['description']}")  # # 动态解析用例描述在测试报告中展示
        user = param['user']   # 登录用户
        main = user_login.goto_Create_Process(user)
        # 新建流程
        open_process = main.process_create(param['module_name'])
        # 发起流程返回步骤路径
        steps_resp = main.get_initiate_steps(param,open_process,opinion='发起流程')
        # 确认路径校验
        steps_info = utils.pack_confirm_steps_field(steps_resp.json())
        dict_assert(expect['确认路径校验'],steps_info)
        # 发起流程
        response = main.initiate_submit(param, steps_resp, '发起流程')
        string_assert.eq(response.status_code, 200)
        proc_id = jsonpath.jsonpath(response.json(),'$.data.proc_id')[0]
        # 数据库查询发起后的流程信息
        history_sql = execute_sql.create_query_sql_history_by_id(proc_id)  # 需要执行的查询sql
        sql = execute_sql.create_process_query_all_master_nodes(proc_id)
        # sql = execute_sql.create_query_sql_by_id(proc_id)  # 需要执行的查询sql
        if '01-1-01' in title:  # 用例1，发起就自动归档，查询历史表
            result = utils.query_until_all_matched(history_sql, expect['数据库校验'])
        else:
            result = utils.query_until_all_matched(sql,expect['数据库校验'],5)
        # 断言数据库中的节点信息
        list_each_equal(expect['数据库校验'], result)
        # 调用发起流程响应的契约格式
        contract_format = pact.initiate_pact_format()
        pact.pact_verify(contract_format,response.json())   # 契约校验
        time.sleep(1)
        result = sqlserver_query_return_contain_field(execute_sql.WfMessageLog_query_sql(proc_id=proc_id),'消息校验')  # 查询消息结果
        two_array_list_contains(expect['消息校验'],result) #消息校验
        Logger.info("*************** {}结束执行用例 ***************".format(title))



if __name__=="__main__":
    pytest.main(['-s',r'D:\PycharmProjects\ProcessCenter_Api_Autotest\case\test_01_initiate_process\01_1_CreateProcess_Confirm_test.py'])